package main

import (
	"fmt"
	"math"
)

/*
长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的连续子数组
并返回其长度。如果不存在符合条件的子数组，返回 0 。

示例 1：
输入：target = 7, nums = [2,3,1,2,4,3]
输出：2
解释：子数组 [4,3] 是该条件下的长度最小的子数组。
 */

// 双指针解法
func minSubArrayLen(s int, nums []int) int {
	start, end := 0, 0   // 双指针
	res, sum := math.MaxInt64, 0   // 结果，保存和
	for end < len(nums) {
		sum += nums[end]
		for sum >= s {   // 当和大于等于目标值时，开始移动start
			if res > end - start + 1 {
				res = end - start + 1
			}
			sum -= nums[start]
			start ++
		}

		end ++   // 和小于目标值，继续移动
	}
	if res == math.MaxInt64 {
		return 0
	}
	return res

}

func main() {
	fmt.Println(minSubArrayLen(7, []int{2,3,1,2,4,3}))
}
